﻿using SIAKADCORE.Helpers;
using SIAKADCORE.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIAKADCORE.Controllers
{
    /// <summary>
    /// Kelas DetailMatakuliahController
    /// </summary>
    public static class DetailMatakuliahController
    {
        /// <summary>
        /// Method untuk menambahkan entri detailMatakuliah.
        /// </summary>
        /// <param name="detailMatakuliah">Kelas DetailMatakuliah.</param>
        /// <returns>True ketika sukses menambahkan entri dan sebaliknya.</returns>
        public static bool Tambah(DetailMatakuliah detailMatakuliah)
        {
            if (!VerifikasiIds(ref detailMatakuliah)) return false;

            string queryString = string.Format("INSERT INTO {0} ({1} ,{2} ,{3} ,{4} ,{5} ,{6}, {7}) VALUES ('{8}' ,'{9}' ,'{10}' ,'{11}' ,'{12}' ,'{13}','(14))",
                DetailMatakuliah.TableName,
                DetailMatakuliah.ColumnNameIdDetailMatakuliah,
                DetailMatakuliah.ColumnNameIdMatakuliah,
                DetailMatakuliah.ColumnNameIdTahun,
                DetailMatakuliah.ColumnNameIdPeriode,
                DetailMatakuliah.ColumnNameIdKelas,
                DetailMatakuliah.ColumnNameIdDosen,
                DetailMatakuliah.ColumnNameIdPertemuan,
                detailMatakuliah.IdDetailMatakuliah,
                detailMatakuliah.IdMatakuliah,
                detailMatakuliah.IdTahun,
                detailMatakuliah.IdPeriode,
                detailMatakuliah.IdKelas,
                detailMatakuliah.IdDosen,
                detailMatakuliah.IdPertemuan); 
            return SQLHelper.Instance.ExecuteNonQuery(queryString);
        }

        /// <summary>
        /// Method untuk menghapus entri dosen.
        /// </summary>
        /// <param name="idDetailMatakuliah">Id detail matakuliah yang akan dihapus.</param>
        /// <returns>True ketika sukses menghapus entri dan sebaliknya.</returns>
        public static bool Hapus(string idDetailMatakuliah)
        {
            string queryString = string.Format("DELETE FROM {0} WHERE {1} = '{2}'",
                DetailMatakuliah.TableName, 
                DetailMatakuliah.ColumnNameIdDetailMatakuliah, idDetailMatakuliah);
            return SQLHelper.Instance.ExecuteNonQuery(queryString);
        }

        /// <summary>
        /// Method untuk verifikasi Ids yang dibutuhkan dalam memasukkan entri baru.
        /// </summary>
        /// <param name="detailMatakuliah">Kelas DetailMatakuliah.</param>
        /// <returns>True ketika semua Ids terdaftar pada masing-masing tabel.</returns>
        private static bool VerifikasiIds(ref DetailMatakuliah detailMatakuliah)
        {
            bool verifikasiMatakuliah = MatakuliahController.IsExist(detailMatakuliah.IdMatakuliah);
            bool verifikasiTahun = TahunController.IsExist(detailMatakuliah.IdTahun);
            bool verifikasiPeriode = PeriodeController.IsExist(detailMatakuliah.IdPeriode);
            bool verifikasiKelas = KelasController.IsExist(detailMatakuliah.IdMatakuliah);
            bool verifikasiDosen = DosenController.IsExist(detailMatakuliah.IdDosen);
            bool verifikasiPertemuan = PertemuanController.IsExist(detailMatakuliah.IdPertemuan);
         

            return (verifikasiMatakuliah && 
                    verifikasiTahun &&
                    verifikasiPeriode && 
                    verifikasiKelas && 
                    verifikasiDosen && 
                    verifikasiPertemuan);
        }

        /// <summary>
        /// Method untuk mendapatkan hasil query dari tabel detailMatakuliah.
        /// </summary>
        /// <param name="dataset">Dataset keluaran yang berisi haisl query.</param>
        /// <returns>True ketika sukses meng-query dan sebaliknya.</returns>
        public static bool GetTabel(out DataSet dataset)
        {
            string queryString = string.Format("");
            return SQLHelper.Instance.ExecuteReader(queryString, out dataset);
        }

        /// <summary>v
        /// Method untuk mendapatkan hasil query dari tabel detailMatakuliah.
        /// </summary>
        /// <param name="dataset">Dataset keluaran yang berisi hasil query.</param>
        /// <param name="customQueryString">Kustomisasi query.</param>
        /// <returns>True ketika sukses meng-query dan sebaliknya.</returns>
        public static bool GetTabel(out DataSet dataset, string customQueryString)
        {
            return SQLHelper.Instance.ExecuteReader(customQueryString, out dataset);
        }

        /// <summary>
        /// Method untuk mendapatkan hasil query dari tabel detailMatakuliah.
        /// </summary>
        /// <param name="dataset">Dataset keluaran yang berisi hasil query.</param>
        /// <returns>True ketika sukses meng-query dan sebaliknya.</returns>
        public static bool GetTabelPreview(out DataSet dataset)
        {
            string queryString = string.Format("SELECT [detail_matakuliah].{0}, [matakuliah].{1}, [periode].{2} FROM {3}, {4}, {5} WHERE [detail_matakuliah].{6} = [matakuliah].{7} AND [detail_matakuliah].{8} = [periode].{9}",
                DetailMatakuliah.ColumnNameIdDetailMatakuliah, Matakuliah.ColumnNameNamaMatakuliah, Periode.ColumnNameNamaPeriode,
                DetailMatakuliah.TableName, Matakuliah.TableName, Periode.TabelName,
                DetailMatakuliah.ColumnNameIdMatakuliah, Matakuliah.ColumnNameIdMatakuliah,
                DetailMatakuliah.ColumnNameIdPeriode, Periode.ColumnNameIdPeriode);
            return SQLHelper.Instance.ExecuteReader(queryString, out dataset);
        }

        /// <summary>
        /// Method untuk mendapatkan id detailMatakuliah dalam tabel.
        /// </summary>
        /// <returns>string kosong ketika terjadi error atau id detailMatakuliah baru.</returns>
        public static string GetID()
        {
            var dataset = new DataSet();
            bool isQueryAccomplished = GetTabel(out dataset);
            if (!isQueryAccomplished) return string.Empty;

            return SQLHelper.Instance.GetID(DetailMatakuliah.IdPrefix, DetailMatakuliah.IdLength, ref dataset);
        }

        public static bool IsExist(string idDetailMataKuliah)
        {
            var dataset = new DataSet();
            string queryString = string.Format("SELECT {0}, {1} FROM {2} WHERE {0} = '{3}'",
                DetailMatakuliah.ColumnNameIdDetailMatakuliah, DetailMatakuliah.ColumnNameIdMatakuliah, DetailMatakuliah.TableName, idDetailMataKuliah);
            bool isSuccess = GetTabel(out dataset, queryString);

            if (!isSuccess)
            {
                return false;
            }
            else
            {
                return dataset.Tables[0].Rows.Count == 1;
            }
        }
    }
}
